package com.cskaoyan.javase.oop3._1interface._4example;

import com.cskaoyan.javase.oop3._1interface._4example.controller.IGoodsController;
import com.cskaoyan.javase.oop3._1interface._4example.controller.impl.IGoodsControllerImpl;
import com.cskaoyan.javase.oop3._1interface._4example.model.Goods;

/**
 * 实际开发中,后端程序员经常需要开发"接口"
 * 这个接口指的是,由后端程序员开发出来提供给前端/其他后端使用的工具,主要就是方法.
 * 这样的一个接口,一个工具,它主要需要知道:
 *      1.对方给传入什么数据/参数
 *      2.拿到对方给的参数后,做出相应处理,最终给出对方什么结果
 * 这两样,就对应Java语法中接口的抽象方法.
 * 也就是说,接口中的抽象方法表示规范,指定标准
 * 先将标准制定,然后围绕标准进行开发,这就是Java程序员的日常工作
 * "中低Java程序员"每天的工作就是"写接口"
 *
 * 举一个案例:
 * 某电商系统后台，前端程序员需要后端程序员，提供接口来完成商品库存的管理，展示页面。
 * 假如前后端商量好，要求：
 *      1.展示全部商品（goods）页面时，将仅装有商品对象的数组返回，前端不提供任何数据。
 *      2.新增商品时，前端提供商品各种参数，后端需要校验ID唯一性，然后将对象插入数组，返回插入结果。
 *      注:这里的插入不是真的插入,而是找一个null的位置,赋值
 *      该方法执行的结果:
 *          a.插入成功,没有以下两种情况
 *          b.传入的ID重复,插入失败
 *          c.数组满了,没有null的位置了,插入失败
 *      这种多个执行结果的方法,我们可以规定返回一个状态码:
 *          a.返回0,表示插入成功
 *          b.返回1,表示传入的ID重复,插入失败
 *          c.返回2,表示数组满了,没有null的位置了,插入失败
 *
 *      这个方法需要的参数是: 商品信息的各种参数
 *      这个方法需要的返回值: 状态码,int类型
 *
 *      3.删除商品时，前端提供商品ID，后端将该商品删除后，返回删除删除结果。（成功返回true，找不到该ID的商品返回false）
 *
 * @since 17:29
 * @author wuguidong@cskaoyan.onaliyun.com
 */
// 测试类，启动类
public class Test {
    public static void main(String[] args) {
        // 在这里，需要展示商品信息,需要依赖于Controller层下的对象
        IGoodsController igc = new IGoodsControllerImpl();
        printAllRealGoods(igc);

        System.out.println("开始插入一条商品信息...........");
        switch (igc.creatGoods(10, "华为P50", "华为", 8848)) {
            case 0:
                System.out.println("插入成功!!");
                printAllRealGoods(igc);
                break;
            case 1:
                System.out.println("id重复,插入失败!");
                printAllRealGoods(igc);
                break;
            case 2:
                System.out.println("数组已满,插入失败!");
                printAllRealGoods(igc);
                break;
        }
    }

    public static void printAllRealGoods(IGoodsController igc) {
        System.out.println("-----------展示全部商品信息--------------");
        Goods[] allRealGoods = igc.getAllRealGoods();
        for (Goods goods : allRealGoods) {
            goods.print();
        }
        System.out.println("-----------以上为全部商品信息--------------");
    }
}
